package br.com.werp.regras.tesouraria.integracao;

import br.com.werp.regras.geral.ErroPadrao;
import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.vos.tabelas.Composicao_documento;
import br.com.werp.regras.geral.vos.tabelas.Tipo_composicao;
import br.com.werp.regras.geral.vos.tabelas.Tipo_composicao_empresa;
import br.com.werp.regras.geral.vos.tabelas.Tipo_composicao_taxada;
import br.com.werp.regras.geral.vos.tesouraria.ComposicaoVO;
import br.com.werp.regras.geral.vos.tesouraria.TipoComposicaoEmpresaVO;
import br.com.werp.regras.geral.vos.tesouraria.TipoComposicaoTaxadaVO;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;


/**
 * @author Sobreira
 * Created on 13/10/2004
 *
 */
public class ComposicaoDAO extends MasterDAO {
    private static final String APAGAR_COMPOSICAO_IMPOSTOS =
        "APAGAR_COMPOSICAO_IMPOSTOS";
    private static final String TIPO_COMPOSICAO_TAXADA =
        "TIPO_COMPOSICAO_TAXADA";
    private static ComposicaoDAO composicaoDAO;

    /**
     * @param banco
     * @throws Exception
     */
    private ComposicaoDAO(String banco) throws Exception {
        super(banco);
    }

    public static ComposicaoDAO getComposicaoDAO() throws Exception {
        if (composicaoDAO == null) {
            ResourceBundle bundle = ResourceBundle.getBundle(Constantes.CONFIG);
            composicaoDAO = new ComposicaoDAO(bundle.getString(Constantes.BANCO));
        }

        return composicaoDAO;
    }

    public static void main(String[] args) throws Exception {
        ComposicaoDAO composicaoDAO = FabricaDAO.getComposicaoDAO();
        Connection con = composicaoDAO.getConexao();
        DatabaseMetaData md = con.getMetaData();
        System.out.println(con.getCatalog());
    }

    /**
     * @param empresaID
     * @param composicaoID
     * @return TipoComposicaoTaxadaVO
     * @throws Exception
     */
    public List obterTipoComposicaoTaxada(int composicaoID)
        throws Exception {
        Connection conn = null;

        try {
            conn = getConexao();

            return preencheVO(conn, new TipoComposicaoTaxadaVO(),
                "TIPO_COMPOSICAO_TAXADA",
                " TCMT_COMPOSICAO_EMPRESA = " + composicaoID 
                ,TipoComposicaoTaxadaVO.EXCLUIDAS);
        } finally {
            liberaConeccao(conn);
        }
    }

    public void inserirComposicaoDocumento(Object conn,
        Composicao_documento composicao_documento) throws Exception {
        Connection connection = validarTransacao(conn);
        String[] excluidas = { "cmdc_id" };
        inserirVO(connection, composicao_documento, excluidas);
    }

    public List obterComposicoes(ComposicaoVO composicaoVO)
        throws Exception {
        Connection conn = null;

        try {
            conn = getConexao();

            String where =
                " and cmdc_composicao = tcme_id and  " +
                " tcme_composicao = tcom_id ";
            String tabelas =
                " composicao_documento, tipo_composicao" +
                ",tipo_composicao_empresa";

            return pesquisarVO(conn, composicaoVO, where, tabelas,
                ComposicaoVO.EXCLUIDAS);
        } finally {
            liberaConeccao(conn);
        }
    }

    public List pesquisarTipo_composicao_empresa(
        Tipo_composicao_empresa tipo_composicao_empresa)
        throws Exception {
        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, tipo_composicao_empresa);
        } finally {
            liberaConeccao(connection);
        }
    }

    public List pesquisarTipo_composicao(Tipo_composicao tipo_composicao)
        throws Exception {
        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, tipo_composicao);
        } finally {
            liberaConeccao(connection);
        }
    }

    public void apagarComposicao(Object key,
        Composicao_documento composicao_documento)
        throws ErroPadrao, SQLException, Exception {
        excluirVO(validarTransacao(key), composicao_documento);
    }

    public List obterTipoComposicaoEmrpesaVO(
        TipoComposicaoEmpresaVO tipoComposicaoEmpresaVO)
        throws Exception {
        String tabelas = "tipo_composicao_empresa,tipo_composicao";
        String where = " and tcme_composicao = tcom_id ";
        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, tipoComposicaoEmpresaVO, where,
                tabelas);
        } finally {
            liberaConeccao(connection);
        }
    }

    public void excluirTipo_composicao_taxada(Object key,
        Tipo_composicao_taxada tipo_composicao_taxada)
        throws ErroPadrao, SQLException, Exception {
        excluirVO(validarTransacao(key), tipo_composicao_taxada);
    }
}
